# 导包
from copy import copy
from copy import deepcopy
# 以下以列表为例,其他的可变类型同理
# 定义列表a,嵌套多层,然后分别做深浅拷贝,修改内容观察效果
a = [10, 20, [30, 40, ['张三', '王五']]]
b = copy(a)
c = deepcopy(a)
# TODO 深浅拷贝相同点:对于第1层都开辟了新空间,原有内容变化,都不会受影响
print(a, b, c)
print(id(a), id(b), id(c))
# 修改原有第一层内容,深浅拷贝的结果都不会受影响
a[0] = 11
print(a, b, c)
print(id(a), id(b), id(c))
print('===================================================================')
# TODO 深浅拷贝不同点: 对于第2层及以上,只有深拷贝才能开辟新空间,浅拷贝就变成了引用传递
# 第二层
print(a[2], b[2], c[2])
print(id(a[2]), id(b[2]), id(c[2]))
# 修改第二层内容,浅拷贝结果会受影响,而深拷贝不会受影响
a[2][0] = 33
print(a)
print(a[2], b[2], c[2])
print(id(a[2]), id(b[2]), id(c[2]))
print('------------------------------------------')
# 第三层
print(a[2][2], b[2][2], c[2][2])
print(id(a[2][2]), id(b[2][2]), id(c[2][2]))
# 修改第三层内容,浅拷贝结果会受影响,而深拷贝不会受影响
a[2][2][0] = '李四'
print(a[2][2], b[2][2], c[2][2])
print(id(a[2][2]), id(b[2][2]), id(c[2][2]))

